package cliente;
import java.awt.Color;
import java.awt.GridLayout;
import java.rmi.RemoteException;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

public class IU_Jogo extends javax.swing.JFrame {

    // InicializaÃ§Ã£o de instÃ¢ncia Ãºnica de IU_Jogo
    private static final IU_Jogo theIU_Jogo = new IU_Jogo();
    private Set<RN_Carta> mao;
    private HashSet<RN_Carta> selecao;
    private RN_Mesa mesa;
    private Boolean selecaoValida = false;
        
    // Construtor privado
    private IU_Jogo(){
        initComponents();
        subMenuSair_Jogo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                try {
                    subMenuSair_JogoActionPerformed(evt);
                } catch (RemoteException ex) {
                    Logger.getLogger(IU_Jogo.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }

    // Ponto de acesso Ã  instÃ¢ncia Ãºnica
    public static IU_Jogo getIU_Jogo(){
        return theIU_Jogo;
    }

    public void atualizarTelaDeJogo(){
        /* Chamado por: SO_PresidenteCliente, VF1
         * Caso de uso: Atualizar Mesa */
        habilitarTela();
        selecao = new HashSet<RN_Carta>();
        this.mostrarMaoEMesa();
        exibirTela();
    }

    public void habilitarTela() {
        /* Chamado por: SO_PresidenteCliente, VF1
         * Caso de uso: Atualizar Mesa */
        setEnabled(true);
    }

    void desabilitarTela() {
        setEnabled(false);
    }

    void fecharTela() {
        dispose();
    }

    private void mostrarMaoEMesa(){
        /* Chamado por: IU_Jogo, VF1
         * Caso de uso: Iniciar partida */

        this.mao = RN_Jogador.getRN_Jogador().getMaoDeCartas();
        this.mesa = RN_Partida.getRN_Partida().getMesa();
        

        montaPainelJogadorDireita();
        montaPainelJogadorEsquerda();
        montaPainelJogadorCima();
        montaPainelDeCartasDoJogador();
        montaMesa();
        mostraMensagem("O jogador da vez eh: "+this.mesa.getJogadorDaVez());
        verificaHabilitacaoDeFazerJogada();
        pack();        
    }

    public void mostraMensagem(String msg){
        campoMsg_Jogo.setText(msg);
    }
    
    public void montaMesa(){
        painelMesa_Jogo.removeAll();
        painelMesa_Jogo.setLayout(new GridLayout(1,4));
        
        if(mesa.getUltimoDescarte().size()==0){
            painelMesa_Jogo.add(new JLabel("Mesa Vazia!"));
        }else{
            for(RN_Carta carta : mesa.getUltimoDescarte()) painelMesa_Jogo.add(new JLabel(carta.getImagemBotao()));
        }
    }
    
    public void montaPainelDeCartasDoJogador(){
        painelCartasJogador.removeAll();                          
        painelCartasJogador.setLayout(new GridLayout(1,13));        
        painelCartasJogador.setBorder(javax.swing.BorderFactory.createTitledBorder(RN_Jogador.getRN_Jogador().getNome()));            
        for(RN_Carta carta : getMao()){            
            painelCartasJogador.add(carta.getBotaoCarta());
            
            if(carta.getBotaoCarta().getActionListeners().length==0){
                carta.getBotaoCarta().addActionListener(new BotaoListener(carta.getBotaoCarta(),carta) {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        cartaClicada(button,carta);
                        
                    }
                });
            }
        }
    }    
    
    public void montaPainelJogadorDireita(){
        painelJogadorDireita_Jogo.removeAll();
        painelJogadorDireita_Jogo.setLayout(new GridLayout(2,1));
        
        JLabel cartasDoJogadorDireita = new JLabel();
        cartasDoJogadorDireita.setForeground(Color.white);
        cartasDoJogadorDireita.setText(mesa.getNumeroDeCartas().get(mesa.getJogadoresNaMesa().get(0)).toString()+" cartas");
        painelJogadorDireita_Jogo.add(cartasDoJogadorDireita);
        
        painelJogadorDireita_Jogo.add(new JLabel(new ImageIcon(CardLoader.getCardLoader().getCardURL()+"verso.png")));
        
        painelJogadorDireita_Jogo.setBorder(javax.swing.BorderFactory.createTitledBorder(mesa.getJogadoresNaMesa().get(0)));
    }
    
    public void montaPainelJogadorCima(){
        painelJogadorCima_Jogo.removeAll();
        painelJogadorCima_Jogo.setLayout(new GridLayout(1,2));
        
        painelJogadorCima_Jogo.setBorder(javax.swing.BorderFactory.createTitledBorder(mesa.getJogadoresNaMesa().get(1)));
                
        JLabel cartasDoJogadorCima = new JLabel();
        cartasDoJogadorCima.setForeground(Color.white);
        cartasDoJogadorCima.setText(mesa.getNumeroDeCartas().get(mesa.getJogadoresNaMesa().get(1)).toString()+" cartas");
        painelJogadorCima_Jogo.add(cartasDoJogadorCima);
        
        painelJogadorCima_Jogo.add(new JLabel(new ImageIcon(CardLoader.getCardLoader().getCardURL()+"verso.png")));
    }
    
    public void montaPainelJogadorEsquerda(){
        painelJogadorEsquerda_Jogo.removeAll();
        painelJogadorEsquerda_Jogo.setLayout(new GridLayout(2,1));
                       
        painelJogadorEsquerda_Jogo.setBorder(javax.swing.BorderFactory.createTitledBorder(mesa.getJogadoresNaMesa().get(2)));
        
        JLabel cartasDoJogadorEsquerda = new JLabel();
        cartasDoJogadorEsquerda.setForeground(Color.white);
        cartasDoJogadorEsquerda.setText(mesa.getNumeroDeCartas().get(mesa.getJogadoresNaMesa().get(2)).toString()+" cartas");
        painelJogadorEsquerda_Jogo.add(cartasDoJogadorEsquerda);
        
        painelJogadorEsquerda_Jogo.add(new JLabel(new ImageIcon(CardLoader.getCardLoader().getCardURL()+"verso.png")));
    }
        
    public void cartaClicada(JButton botao,RN_Carta carta){
                
        if(isJogadorDaVez()){
            
            if(!carta.isSelecionado()){
                carta.setSelecionado(true);
                botao.setIcon(carta.getImagemBotaoSelecionado());
                getSelecao().add(carta);
            }
            else{
                carta.setSelecionado(false);
                botao.setIcon(carta.getImagemBotao());
                getSelecao().remove(carta);
            }
        }
        
    }

    public HashSet<RN_Carta> getSelecao() {
        return selecao;
    }   
    
    public void exibirTela(){
        this.setVisible(true);       
        
    }

    public Set<RN_Carta> getMao() {
        return mao;
    }

    private void fazerJogada(Set<RN_Carta> selecao) throws RemoteException{
        /* Chamado por: Jogador
         * Caso de uso: Fazer Jogada, VF1 */
        if(RN_Partida.getRN_Partida().validarSelecao(selecao)){
            for(RN_Carta carta : getMao()) carta.setSelecionado(false);
            RN_Partida.getRN_Partida().fazerJogada(selecao);
            return;
        }
        mostraMensagem("Selecao invalida! Tente novamente!");
    }
    
    public void sairDaPartidaEmAndamento() throws RemoteException{
        /* Chamado por: Jogador
         * Caso de uso: Sair da Partida em andamento, VF1 */
        SO_PresidenteCliente.getSO_PresidenteCliente().desconectarJogadores();
    }
    
    public void habilitaBotaoFazerJogada(){
        botaoFazerJogada_Jogo.setEnabled(true);
    }
    
    public void desabilitaBotaoFazerJogada(){
        botaoFazerJogada_Jogo.setEnabled(false);
    }
    
    public boolean isJogadorDaVez(){
        if(mesa.getJogadorDaVez().equals(RN_Jogador.getRN_Jogador().getNome())) return true;
        return false;
    }
    
    public void verificaHabilitacaoDeFazerJogada(){
        desabilitaBotaoFazerJogada();
        if(isJogadorDaVez()) habilitaBotaoFazerJogada();
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        painelJogadorEsquerda_Jogo = new javax.swing.JPanel();
        painelCartasJogador = new javax.swing.JPanel();
        painelJogadorDireita_Jogo = new javax.swing.JPanel();
        painelJogadorCima_Jogo = new javax.swing.JPanel();
        painelMesa_Jogo = new javax.swing.JPanel();
        painelMsgEBotao_Jogo = new javax.swing.JPanel();
        campoMsg_Jogo = new javax.swing.JTextField();
        botaoFazerJogada_Jogo = new javax.swing.JButton();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        subMenuSair_Jogo = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setTitle("Jogo");
        setBackground(new java.awt.Color(51, 153, 0));
        setMinimumSize(new java.awt.Dimension(1215, 500));
        setName("frame_Jogo"); // NOI18N
        setResizable(false);

        painelJogadorEsquerda_Jogo.setBackground(new java.awt.Color(51, 159, 0));

        javax.swing.GroupLayout painelJogadorEsquerda_JogoLayout = new javax.swing.GroupLayout(painelJogadorEsquerda_Jogo);
        painelJogadorEsquerda_Jogo.setLayout(painelJogadorEsquerda_JogoLayout);
        painelJogadorEsquerda_JogoLayout.setHorizontalGroup(
            painelJogadorEsquerda_JogoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 72, Short.MAX_VALUE)
        );
        painelJogadorEsquerda_JogoLayout.setVerticalGroup(
            painelJogadorEsquerda_JogoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 232, Short.MAX_VALUE)
        );

        painelCartasJogador.setBorder(javax.swing.BorderFactory.createTitledBorder(""));

        javax.swing.GroupLayout painelCartasJogadorLayout = new javax.swing.GroupLayout(painelCartasJogador);
        painelCartasJogador.setLayout(painelCartasJogadorLayout);
        painelCartasJogadorLayout.setHorizontalGroup(
            painelCartasJogadorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 417, Short.MAX_VALUE)
        );
        painelCartasJogadorLayout.setVerticalGroup(
            painelCartasJogadorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 104, Short.MAX_VALUE)
        );

        painelJogadorDireita_Jogo.setBackground(new java.awt.Color(51, 153, 0));

        javax.swing.GroupLayout painelJogadorDireita_JogoLayout = new javax.swing.GroupLayout(painelJogadorDireita_Jogo);
        painelJogadorDireita_Jogo.setLayout(painelJogadorDireita_JogoLayout);
        painelJogadorDireita_JogoLayout.setHorizontalGroup(
            painelJogadorDireita_JogoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 78, Short.MAX_VALUE)
        );
        painelJogadorDireita_JogoLayout.setVerticalGroup(
            painelJogadorDireita_JogoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 232, Short.MAX_VALUE)
        );

        painelJogadorCima_Jogo.setBackground(new java.awt.Color(51, 153, 0));

        javax.swing.GroupLayout painelJogadorCima_JogoLayout = new javax.swing.GroupLayout(painelJogadorCima_Jogo);
        painelJogadorCima_Jogo.setLayout(painelJogadorCima_JogoLayout);
        painelJogadorCima_JogoLayout.setHorizontalGroup(
            painelJogadorCima_JogoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 267, Short.MAX_VALUE)
        );
        painelJogadorCima_JogoLayout.setVerticalGroup(
            painelJogadorCima_JogoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 79, Short.MAX_VALUE)
        );

        painelMesa_Jogo.setBackground(new java.awt.Color(51, 153, 0));
        painelMesa_Jogo.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));

        javax.swing.GroupLayout painelMesa_JogoLayout = new javax.swing.GroupLayout(painelMesa_Jogo);
        painelMesa_Jogo.setLayout(painelMesa_JogoLayout);
        painelMesa_JogoLayout.setHorizontalGroup(
            painelMesa_JogoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 263, Short.MAX_VALUE)
        );
        painelMesa_JogoLayout.setVerticalGroup(
            painelMesa_JogoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 81, Short.MAX_VALUE)
        );

        painelMsgEBotao_Jogo.setBackground(new java.awt.Color(51, 153, 0));
        painelMsgEBotao_Jogo.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));

        campoMsg_Jogo.setEditable(false);

        botaoFazerJogada_Jogo.setText("Fazer Jogada");
        botaoFazerJogada_Jogo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoFazerJogada_JogoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout painelMsgEBotao_JogoLayout = new javax.swing.GroupLayout(painelMsgEBotao_Jogo);
        painelMsgEBotao_Jogo.setLayout(painelMsgEBotao_JogoLayout);
        painelMsgEBotao_JogoLayout.setHorizontalGroup(
            painelMsgEBotao_JogoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelMsgEBotao_JogoLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(campoMsg_Jogo, javax.swing.GroupLayout.DEFAULT_SIZE, 140, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botaoFazerJogada_Jogo)
                .addContainerGap())
        );
        painelMsgEBotao_JogoLayout.setVerticalGroup(
            painelMsgEBotao_JogoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelMsgEBotao_JogoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(painelMsgEBotao_JogoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botaoFazerJogada_Jogo)
                    .addComponent(campoMsg_Jogo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jMenu1.setText("Jogo");

        subMenuSair_Jogo.setText("Sair");
        jMenu1.add(subMenuSair_Jogo);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(painelCartasJogador, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addComponent(painelJogadorEsquerda_Jogo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(painelMesa_Jogo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(painelMsgEBotao_Jogo, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(painelJogadorCima_Jogo, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(painelJogadorDireita_Jogo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(painelJogadorDireita_Jogo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(painelJogadorEsquerda_Jogo, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(painelJogadorCima_Jogo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(painelMesa_Jogo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(painelMsgEBotao_Jogo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(7, 7, 7)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(painelCartasJogador, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void botaoFazerJogada_JogoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botaoFazerJogada_JogoActionPerformed
        try {
            fazerJogada(getSelecao());//GEN-LAST:event_botaoFazerJogada_JogoActionPerformed
        } catch (RemoteException ex) {}
}


private void subMenuSair_JogoActionPerformed(java.awt.event.ActionEvent evt) throws RemoteException {
    SO_PresidenteCliente.getSO_PresidenteCliente().desconectarJogadores();
    IU_Inicial.getIU_Inicial().habilitarTela();
    IU_Inicial.getIU_Inicial().habilitarBotaoConexaoRemota();
    fecharTela();

}

    /**
    * @param args the command line arguments
    */
//    public static void main(String args[]) {
//        java.awt.EventQueue.invokeLater(new Runnable() {
//            public void run() {
//                new IU_Jogo().setVisible(true);
//            }
//        });
//    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botaoFazerJogada_Jogo;
    private javax.swing.JTextField campoMsg_Jogo;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JPanel painelCartasJogador;
    private javax.swing.JPanel painelJogadorCima_Jogo;
    private javax.swing.JPanel painelJogadorDireita_Jogo;
    private javax.swing.JPanel painelJogadorEsquerda_Jogo;
    private javax.swing.JPanel painelMesa_Jogo;
    private javax.swing.JPanel painelMsgEBotao_Jogo;
    private javax.swing.JMenuItem subMenuSair_Jogo;
    // End of variables declaration//GEN-END:variables
    
}
